

class Human():
    school='航校'
    # 相当于JavaScript中的constructor
    def __init__(self,xm,age):
        self.name = xm
        self.age = age
    # 静态方法
    @staticmethod
    def sm():
        print('这是一个静态方法，不支持调用实例属性，也不支持调用实例方法')

    def describe(self):
        print(f'我叫{self.name},来自{self.school},今年{self.age}岁')


def extendMethod(self):
    # 给类动态添加方法一定要加 self 参数，因为把一个函数绑定到类或者实例时，Python 会自动把实例本身当作第一个参数传递给这个函数，也就是self参数。
    print('我是类动态创建的方法')
student = Human('张飞',33)
# student.sm()
# student.describe()
def dynamic():
    print('我是动态创建的方法')
student.dynamic = dynamic
# student.dynamic()
Human.extendMethod = extendMethod
# student.extendMethod()

class Animals():
    def __init__(self,name,food):
        self.name=name    # 普通的实例属性，类的内部、外部、及子类都可以访问
        self._name='保护的名称-'+name   # self._name是受保护的，只能本类和子类访问
        self.__name='私有--'+name  # self.__name表示私有的，只能类本身内部去访问
        self.food=food

    def _func(self):# 受保护的
        print('本身及子类访问')

    def __staticFn(self):# 私有的
        print('只有定义的类可以访问')

    def public(self):
        print('这是普通的实例方法')
        self._func()
        self.__staticFn()
        print(self._name)
        print(self.__name)

cat = Animals('加菲','鱼')
# cat.public()
# print(cat.__name)# AttributeError: 'Animals' object has no attribute '__name'.
print(cat._name)
# print(Animals.__name)# AttributeError: type object 'Animals' has no attribute
# print(Animals.__staticFn)# AttributeError: type object 'Animals' has no attribute '__staticFn'
# print(cat.__staticFn)# AttributeError: 'Animals' object has no attribute '__staticFn'

# print(dir(cat))


class Person():
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def descibe(self):
        print(f'我叫{self.name},今年{self.age}')


class Student(Person):
    def __init__(self,name,age):
        super().__init__(name,age)

class Doctor():
    def __init__(self,name,age):
        self.name=name
        self.age=age
    def whoIm(self):
        print('我是父类Doctor方法')

stu=Student('刘表',33)
# stu.descibe()


class Kinds(Person,Doctor):
    def __init__(self,name,age,num):
        Person.__init__(self,name,age)
        Doctor.__init__(self,name,age)
        self.num = num
    def descibe(self):# 父类方法重写
        # 可选：调用父类方法继承  不继承也可以完全重写
        # Person.descibe(self)
        print(f'我叫{self.name},今年{self.age},学号是{self.num}')


daughter = Kinds('刘亦菲',33,201501321)
daughter.descibe()
daughter.whoIm()








